package conexao;

import java.util.ResourceBundle;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import exceptions.ConexaoException;
import exceptions.ModelException;

public class ConexaoImpl implements Conexao{
	private static ConexaoImpl instancia;
    
	String usuario;
    String senha;
    String url;
    String driver;
    
    private ConexaoImpl(){
    	ResourceBundle arquivoConfig = ResourceBundle.getBundle("conexao.config");
    	
    	usuario = arquivoConfig.getString("usr");
    	senha   = arquivoConfig.getString("pwd");
    	url     = arquivoConfig.getString("url");
    	driver  = arquivoConfig.getString("drv");
    }

	public static Conexao getInstancia() {
		if (instancia == null)
			instancia = new ConexaoImpl();
		return instancia;
	}
	
	public Connection conectar() throws ConexaoException {
        try{
            Class.forName(driver);
            Connection conex = DriverManager.getConnection(url,usuario,senha);
            return conex;
        }catch(ClassNotFoundException e){
            throw new ConexaoException("Aconteceu o seguinte erro: " + e.getMessage());
        }catch(SQLException e){
            throw new ConexaoException("Aconteceu o seguinte erro ao conectar a base de dados:  " + e.getMessage());
        }
    }

    public void desconectar(Connection conex) throws ConexaoException{
        try{
            conex.close();
        }catch(SQLException e){
            throw new ConexaoException("Aconteceu o seguinte erro ao desconectar a base de dados: " + e.getMessage());
        }
    }
    
    public int ultimoCodigo(String nomeTabela) throws ConexaoException, ModelException{
    	Connection conex = instancia.conectar();
    	int ultimo = 0;
    	
    	String sql = "SELECT Max(Codigo) as Ultimo FROM " + nomeTabela;
		
        try{
            PreparedStatement pstm = conex.prepareStatement(sql);
            ResultSet rs = pstm.executeQuery();
            rs.next();
            
            ultimo = rs.getInt("Ultimo");
            pstm.close();
            
            return ultimo;
        }catch(SQLException e){
            throw new ModelException(e.getMessage());
        }finally{
        	instancia.desconectar(conex);        	
        }
    }

}
